{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2ccc9544-9e6a-4d90-bfc2-dfafc59809eb",
   "metadata": {},
   "source": [
    "Chapter 07\n",
    "\n",
    "# 可视化线性方程组\n",
    "《线性代数》 | 鸢尾花书：数学不难"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee43e682-236f-4ff8-95da-1944cc9674d7",
   "metadata": {},
   "source": [
    "该代码的目的是**可视化**一个 **二维线性方程组** 的解集，即两条直线在平面上的交点。我们从数学角度分析代码的计算过程，并解释其核心思想。\n",
    "\n",
    "---\n",
    "\n",
    "## **数学建模**\n",
    "代码涉及一个线性方程组的几何表示。一般而言，**线性方程组**可以表示为：\n",
    "$$\n",
    "A \\mathbf{x} = \\mathbf{b}\n",
    "$$\n",
    "其中：\n",
    "$$\n",
    "A = \\begin{bmatrix} a_{11} & a_{12} \\\\ a_{21} & a_{22} \\end{bmatrix}, \\quad\n",
    "\\mathbf{x} = \\begin{bmatrix} x_1 \\\\ x_2 \\end{bmatrix}, \\quad\n",
    "\\mathbf{b} = \\begin{bmatrix} b_1 \\\\ b_2 \\end{bmatrix}\n",
    "$$\n",
    "\n",
    "展开后，即：\n",
    "$$\n",
    "\\begin{cases}\n",
    "a_{11} x_1 + a_{12} x_2 = b_1 \\\\\n",
    "a_{21} x_1 + a_{22} x_2 = b_2\n",
    "\\end{cases}\n",
    "$$\n",
    "\n",
    "这表示两条直线在二维平面上的方程。代码的作用是 **绘制这两条直线**，并观察它们的交点。\n",
    "\n",
    "---\n",
    "\n",
    "## **代码解析**\n",
    "### **1. 定义绘图范围**\n",
    "代码使用 `np.linspace(-4, 4, 400)` 定义变量 $x_1$ 和 $x_2$ 的取值范围，即在 $[-4,4]$ 之间均匀取 400 个点。然后，`np.meshgrid(x1, x2)` 生成一个 **网格点矩阵** $(xx_1, xx_2)$，用于计算方程的值。\n",
    "\n",
    "### **2. 计算两个方程的值**\n",
    "代码使用：\n",
    "$$\n",
    "zz_1 = a_{11} x_1 + a_{12} x_2 - b_1\n",
    "$$\n",
    "$$\n",
    "zz_2 = a_{21} x_1 + a_{22} x_2 - b_2\n",
    "$$\n",
    "\n",
    "来计算两个方程的等高值。等高值为 $0$ 的地方，即：\n",
    "$$\n",
    "a_{11} x_1 + a_{12} x_2 = b_1\n",
    "$$\n",
    "$$\n",
    "a_{21} x_1 + a_{22} x_2 = b_2\n",
    "$$\n",
    "就是直线的方程。\n",
    "\n",
    "### **3. 绘制等高线**\n",
    "代码使用 `plt.contour()` 绘制等高线：\n",
    "- **第一条直线（红色）：** $a_{11} x_1 + a_{12} x_2 = b_1$\n",
    "- **第二条直线（蓝色）：** $a_{21} x_1 + a_{22} x_2 = b_2$\n",
    "\n",
    "等高线 `levels=[0]` 表示绘制**值为 0 的等高线**，即原方程的解。\n",
    "\n",
    "---\n",
    "\n",
    "## **几何解释**\n",
    "### **交点的计算**\n",
    "若两条直线相交，即方程组有唯一解，则交点 $(x_1, x_2)$ 为：\n",
    "$$\n",
    "\\mathbf{x} = A^{-1} \\mathbf{b}\n",
    "$$\n",
    "其中：\n",
    "$$\n",
    "A^{-1} = \\frac{1}{\\det(A)} \\begin{bmatrix} a_{22} & -a_{12} \\\\ -a_{21} & a_{11} \\end{bmatrix}\n",
    "$$\n",
    "$$\n",
    "\\det(A) = a_{11} a_{22} - a_{12} a_{21}\n",
    "$$\n",
    "\n",
    "如果 $\\det(A) \\neq 0$，则交点唯一。如果 $\\det(A) = 0$，则可能**无解或无穷多解**。\n",
    "\n",
    "---\n",
    "\n",
    "## **示例：具体数值计算**\n",
    "在代码中，我们设定：\n",
    "$$\n",
    "A = \\begin{bmatrix} 1 & -1 \\\\ 3 & 3 \\end{bmatrix}, \\quad\n",
    "b = \\begin{bmatrix} 2 \\\\ 0 \\end{bmatrix}\n",
    "$$\n",
    "\n",
    "对应方程：\n",
    "$$\n",
    "\\begin{cases}\n",
    "x_1 - x_2 = 2 \\\\\n",
    "3x_1 + 3x_2 = 0\n",
    "\\end{cases}\n",
    "$$\n",
    "\n",
    "计算行列式：\n",
    "$$\n",
    "\\det(A) = (1)(3) - (-1)(3) = 3 + 3 = 6 \\neq 0\n",
    "$$\n",
    "\n",
    "因此，该方程组有**唯一解**。使用矩阵求解：\n",
    "$$\n",
    "A^{-1} = \\frac{1}{6} \\begin{bmatrix} 3 & 1 \\\\ -3 & 1 \\end{bmatrix}\n",
    "$$\n",
    "\n",
    "$$\n",
    "\\mathbf{x} = A^{-1} \\mathbf{b} = \\frac{1}{6} \\begin{bmatrix} 3 & 1 \\\\ -3 & 1 \\end{bmatrix} \\begin{bmatrix} 2 \\\\ 0 \\end{bmatrix}\n",
    "$$\n",
    "\n",
    "计算：\n",
    "$$\n",
    "x_1 = \\frac{3 \\times 2 + 1 \\times 0}{6} = \\frac{6}{6} = 1\n",
    "$$\n",
    "$$\n",
    "x_2 = \\frac{-3 \\times 2 + 1 \\times 0}{6} = \\frac{-6}{6} = -1\n",
    "$$\n",
    "\n",
    "即交点为：\n",
    "$$\n",
    "(x_1, x_2) = (1, -1)\n",
    "$$\n",
    "\n",
    "---\n",
    "\n",
    "## **可视化分析**\n",
    "1. **代码绘制了两条直线的等高线（红色和蓝色）。**\n",
    "2. **直线的交点即为方程组的解**，在图上可以清晰地看到。\n",
    "3. 如果两条直线**平行（无交点）或重合（无穷多交点）**，代码仍能正确绘制相应情况。\n",
    "\n",
    "---\n",
    "\n",
    "## **总结**\n",
    "该代码的核心目标是 **可视化一个线性方程组的几何解**，通过绘制方程的 **等高线** 来显示解集的结构：\n",
    "- **唯一解**：两条直线相交，交点即为解。\n",
    "- **无解**：两条直线平行，没有交点。\n",
    "- **无穷多解**：两条直线重合，存在无穷多个解。\n",
    "\n",
    "本质上，该代码利用 **数值网格计算和等高线绘制** 方法，把抽象的代数问题转化为 **直观的几何图像**，帮助理解线性方程组的解。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "00345798-17e8-47e2-9061-8452a3279fe1",
   "metadata": {},
   "source": [
    "## 初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3e9df289-61a2-4076-a39c-f085bdfbf9f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7fdcbc45-8927-4698-87b0-f303be8e8501",
   "metadata": {},
   "source": [
    "## 自定义函数求交点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "2b9d7c11-a297-41e9-ac23-ad25f1e38e6c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def intersect(a_11, a_12, b_1, a_21, a_22, b_2):\n",
    "    # 系数矩阵\n",
    "    A = np.array([[a_11, a_12], \n",
    "                  [a_21, a_22]])  \n",
    "    \n",
    "    # 常数列向量\n",
    "    b = np.array([b_1, b_2])  \n",
    "    \n",
    "    # 判断方程组是否有唯一解\n",
    "    if np.linalg.det(A) != 0:\n",
    "        x_intersection = np.linalg.solve(A, b)  # 计算交点\n",
    "        x1_intersect, x2_intersect = x_intersection[0], x_intersection[1]\n",
    "    else:\n",
    "        x1_intersect, x2_intersect = None, None  # 线性无关情况\n",
    "\n",
    "    return x1_intersect, x2_intersect"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aca43fc3-a231-4d46-ba77-5bd9d7c1b4ba",
   "metadata": {},
   "source": [
    "## 自定义可视化函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "f73c84eb-a322-4ead-bcd9-0469fa2d3217",
   "metadata": {},
   "outputs": [],
   "source": [
    "def visualize(a_11, a_12, b_1, a_21, a_22, b_2):\n",
    "    # 定义绘图范围\n",
    "    x1 = np.linspace(-4, 4, 400)  # x1 取值范围\n",
    "    x2 = np.linspace(-4, 4, 400)  # x2 取值范围\n",
    "    xx1, xx2 = np.meshgrid(x1, x2)  # 生成网格点\n",
    "    \n",
    "    # 计算两个方程的值\n",
    "    zz1 = a_11 * xx1 + a_12 * xx2 - b_1  # 第一条直线等高线值\n",
    "    zz2 = a_21 * xx1 + a_22 * xx2 - b_2  # 第二条直线等高线值\n",
    "    \n",
    "    # 绘制等高线\n",
    "    plt.figure(figsize=(5, 5))\n",
    "    \n",
    "    # 红色等高线\n",
    "    plt.contour(xx1, xx2, zz1, levels=[0], colors='red', \n",
    "                linewidths=2, linestyles='solid')  \n",
    "\n",
    "    # 蓝色等高线\n",
    "    plt.contour(xx1, xx2, zz2, levels=[0], colors='blue', \n",
    "                linewidths=2, linestyles='solid')  \n",
    "\n",
    "    # 计算交点\n",
    "    x1_intersect, x2_intersect = intersect(a_11, a_12, b_1, a_21, a_22, b_2)\n",
    "    \n",
    "    # 绘制交点\n",
    "    if x1_intersect is not None and x2_intersect is not None:\n",
    "        plt.scatter(x1_intersect, x2_intersect, color='black', \n",
    "                    marker='o', s=100, label='Intersection')  # 绘制交点\n",
    "    \n",
    "    # 图像装饰\n",
    "    plt.xlabel('$x_1$', fontsize=12)\n",
    "    plt.ylabel('$x_2$', fontsize=12)\n",
    "    plt.grid(True, linestyle='--', color = '0.8')\n",
    "    plt.axhline(0, color='black', linewidth=1)\n",
    "    plt.axvline(0, color='black', linewidth=1)\n",
    "    plt.gca().set_aspect('equal', adjustable='box')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3b31485c-a8b7-4852-8879-02e23b427e59",
   "metadata": {},
   "source": [
    "## 定义参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "8f786c1e-c58c-4bda-ae4d-47073b728a63",
   "metadata": {},
   "outputs": [],
   "source": [
    "a_11, a_12, b_1 = 1, -1, 2  # 第一条直线的参数\n",
    "a_21, a_22, b_2 = 3, 3, 0   # 第二条直线的参数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d69e349-f6ba-4b08-bd69-d75809dcece0",
   "metadata": {},
   "source": [
    "## 可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "6ac98293-2b55-427c-848e-f9505b94b5d4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualize(a_11, a_12, b_1, a_21, a_22, b_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e5039246-ccb4-42c1-ae00-60f6435ec6f7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "a27c574d-bcdd-44fa-a2e8-204e09fbdff2",
   "metadata": {},
   "source": [
    "作者\t**生姜DrGinger**  \n",
    "脚本\t**生姜DrGinger**  \n",
    "视频\t**崔崔CuiCui**  \n",
    "开源资源\t[**GitHub**](https://github.com/Visualize-ML)  \n",
    "平台\t[**油管**](https://www.youtube.com/@DrGinger_Jiang)\t\t\n",
    "\t\t[**iris小课堂**](https://space.bilibili.com/3546865719052873)\t\t\n",
    "\t\t[**生姜DrGinger**](https://space.bilibili.com/513194466)  "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
